home *** CD-ROM | disk | FTP | other *** search
/ Monster Media 1996 #15 / Monster Media Number 15 (Monster Media)(July 1996).ISO / prog_c / lsdoor09.zip / EXAMPLE4.DSK (.txt) < prev    next >
Turbo C Context File  |  1996-06-02  |  28KB  |  751 lines

  1. Turbo C Context File 
  2. COMM_X.LIB
  3. LSDOOR1.LIB
  4. EXAMPLE4.CPP
  5. D:\C\SOURCE\IPX\*.*
  6. C:\CTEMP\*.*
  7. D:\C\SOURCE\ADDCOUNT.CPP
  8. D:\C\SOURCE
  9. C:\CTEMP\IPX\*.*
  10. D:\C\SOURCE\EWIL\*.*
  11. D:\C\SOURCE\SOUND\*.*
  12. D:\FV\LSDOOR\*.*\SOURCE\SOUND\*.*
  13. D:\C\SOURCE\LIGHT\DOOR.CPP
  14. D:\C\SOURCE\LIGHT\LS.CPP
  15. D:\FV\LSDOOR\*.*
  16. D:\C\SOURCE\LIGHT\*.CPP
  17. D:\C\SOURCE\LIGHT\*.H
  18. D:\FV\LSDOOR\*.H
  19. D:\FV\LSDOOR\*.CPP
  20.  void *.c 
  21. void *.c
  22. node.ID.num
  23. best_userserch
  24. read_single
  25. Load(
  26. Change
  27. player.rael
  28. unsigned
  29. .real
  30. &player
  31. filearea
  32. Group
  33. group
  34. Event
  35. event
  36. short
  37. player
  38. Player
  39. (void *)&player
  40. *.CPP
  41. ..\OUT.CPP
  42. ..\*.*
  43. D:\C\SOURCE\GRAPHICS\*.ASM
  44. D:\C\SOURCE\GRAPHICS\*.CPP
  45. D:\C\SOURCE\OUT.CPP
  46. D:\FV\LSDOOR\*.CPP
  47. D:\C\SOURCE\LIGHT\LSDOOR1.LIB
  48. D:\FV\LSDOOR\*.CPPLSDOOR1.LIB
  49. D:\FV\LSDOOR\*.C??
  50. D:\FV\LSDOOR\*.LIB
  51. D:\C\SOURCE\COMM\COMM_H.LIB
  52. \FV\LSDOOR\*.LIB
  53. D:\C\SOURCE\LIGHT\DISPF.H
  54. D:\C\SOURCE\LIGHT\DATA.H
  55. D:\FV\LSDOOR\EXAMPLE5.CPP
  56. D:\FV\LSDOOR\EXAMPLE4.CPP
  57. D:\FV\LSDOOR\EXAMPLE4.H
  58. D:\FV\LSDOOR\EXAMPLE5.CPP
  59. D:\FV\LSDOOR\EXAMPLE4.CPP
  60. D:\FV\LSDOOR\REINDEX.CPP
  61. D:\FV\LSDOOR\REINDEX.CPP
  62. D:\FV\LSDOOR\EXAMPLE5.CPP
  63. D:\FV\LSDOOR\EXAMPLE4.CPP
  64. D:\FV\LSDOOR\EXAMPLE4.CPP
  65. D:\C\SOURCE\COMM\COMM_H.LIB
  66. D:\FV\LSDOOR\LORDDEMO.CPP
  67. D:\FV\LSDOOR\EXAMPLE4.CPP
  68. a          if( ! totalvotes ) continue;
  69.           if( topic.votes[jj] == winnerlevel ) display("@Y"); else display("@C");
  70.           for( ; n< a/b*40/3 ; n++ )
  71.         display("%c", 178);
  72.           if( topic.votes[jj] == winnerlevel ) display("@R"); else display("@c");
  73.           for( ; n< a/b*40/3*2 ; n++ )
  74.         display("%c", 177);
  75.           if( topic.votes[jj] == winnerlevel ) display("@r"); else display("@B");
  76.           for( ; n< a/b*40 ; n++ )
  77.         display("%c", 176);
  78.       // Serial/Console version of puts() without any string modifications.
  79. int out( const char *s )
  80.   char *r = (char *)s;
  81.   while( 1 )
  82.     if( *r == NULL ) break;
  83.     s_out( *r );
  84.     r++;
  85.   return 1;
  86. /////////////////////////////////////////////////
  87. int outputs( const char *s )
  88.   char *r = (char *)s;
  89.   while( 1 )
  90.     if( *r == NULL ) { s_out( 10 ); s_out( 13 ); break; } //  \0 replcd by \n
  91.     s_out( *r );
  92.     r++;
  93.   return 1;
  94. /////////////////////////////////////////////////
  95.           //// Serial/Console version of display() function.
  96. void out_codes( char *format )
  97. //  va_list ap;
  98.   int i,j; char k[512];
  99. //  int pass_spaces=0;
  100. //  va_start( ap, format );
  101.   while( *format )
  102.     if( *format!='@' && *format!='%' ) s_out(*format);
  103.     else
  104.     {
  105.       if( *format=='@' )
  106.       {
  107.     if( terminal == TERM_ASCII ){
  108.       format++;
  109.       if( *format == '{' ){ format++; format++; } else format++;
  110.       continue;
  111.     ritin:
  112.     format++;
  113.     switch( *format )
  114.       case '0': s_out( 27 ); out("[0;30m"); break;
  115.       case 'r': s_out( 27 ); out("[0;31m"); break;
  116.       case 'g': s_out( 27 ); out("[0;32m"); break;
  117.       case 'y': s_out( 27 ); out("[0;33m"); break;
  118.       case 'b': s_out( 27 ); out("[0;34m"); break;
  119.       case 'm': s_out( 27 ); out("[0;35m"); break;
  120.       case 'c': s_out( 27 ); out("[0;36m"); break;
  121.       case 'w': s_out( 27 ); out("[0;37m"); break;
  122.       case '1': s_out( 27 ); out("[1;30m"); break;
  123.       case 'R': s_out( 27 ); out("[1;31m"); break;
  124.       case 'G': s_out( 27 ); out("[1;32m"); break;
  125.       case 'Y': s_out( 27 ); out("[1;33m"); break;
  126.       case 'B': s_out( 27 ); out("[1;34m"); break;
  127.       case 'M': s_out( 27 ); out("[1;35m"); break;
  128.       case 'C': s_out( 27 ); out("[1;36m"); break;
  129.       case 'W': s_out( 27 ); out("[1;37m"); break;
  130.       case '{': format++;
  131.         switch( *format )
  132.         {
  133.           case '1': case '0': s_out( 27 ); out("[40m"); break;
  134.           case 'R': case 'r': s_out( 27 ); out("[41m"); break;
  135.           case 'G': case 'g': s_out( 27 ); out("[42m"); break;
  136.           case 'Y': case 'y': s_out( 27 ); out("[43m"); break;
  137.           case 'B': case 'b': s_out( 27 ); out("[44m"); break;
  138.           case 'M': case 'm': s_out( 27 ); out("[45m"); break;
  139.           case 'C': case 'c': s_out( 27 ); out("[46m"); break;
  140.           case 'W': case 'w': s_out( 27 ); out("[47m"); break;
  141.         }
  142.         format++;
  143.         break;
  144.       }
  145. #if 0
  146.       if( *format=='%' )
  147.       {
  148.     pass_spaces=0;
  149.     readnxt:
  150.     format++;
  151.     switch( *format )
  152.       case '-': pass_spaces++; goto readnxt;
  153.       case 'i':
  154.       case 'd': sprintf(k, "%d", va_arg( ap, signed int ) ); break;
  155.       case 'l': sprintf(k, "%ld", va_arg( ap, signed int ) ); break;
  156.       case 'o': sprintf(k, "%o", va_arg( ap, unsigned int ) ); break;
  157.       case 'u': sprintf(k, "%u", va_arg( ap, unsigned int ) ); break;
  158.       case 'x': sprintf(k, "%x", va_arg( ap, unsigned int ) ); break;
  159.       case 'X': sprintf(k, "%X", va_arg( ap, unsigned int ) ); break;
  160.       case 'f': sprintf(k, "%f", va_arg( ap, float ) ); break;
  161.       case 'e': sprintf(k, "%e", va_arg( ap, float ) ); break;
  162.       case 'g': sprintf(k, "%g", va_arg( ap, float ) ); break;
  163.       case 'E': sprintf(k, "%E", va_arg( ap, float ) ); break;
  164.       case 'G': sprintf(k, "%G", va_arg( ap, float ) ); break;
  165.       case 'c': sprintf(k, "%c", va_arg( ap, char ) ); break;
  166.       case 's': sprintf(k, "%s", va_arg( ap, char * ) ); break;
  167.       case '%': sprintf(k, "%%"); break;
  168. //      if( pass_spaces )
  169.       out( /*"%-s",*/ k );
  170.        /*       else */out( /*"%s",*/ k );
  171.       }
  172. #endif
  173.     }
  174.     format++;
  175. //  va_end( ap );
  176. /////////////////////////////////////////////////
  177. int display( const char *format, ... )
  178.   char outbuf[ 512 ], sp_s[ 512 ], k[ 40 ], pointed[ 40 ];
  179.   char *outb = (char *)outbuf, *ponted;
  180.   int conv=0, x=0;
  181.   for( x=0; x<512; x++ ){ outbuf[x]=NULL; sp_s[x]=NULL; }
  182.   va_list ap;
  183.   va_start( ap, format );
  184.   while( *format )
  185.     if( *format=='%' )
  186.     {
  187.       for( x=0; x<40; x++ ) k[x] = NULL;
  188.       int go_furthr = 1, k_pos=0;
  189.       while( go_furthr ){
  190.     switch( *format ){
  191.       case '*':
  192.         for( x=0; x<40; x++ ) pointed[x] = NULL;
  193.         itoa( va_arg( ap, signed int ), pointed, 10 );
  194.         ponted = (char *)pointed;
  195.         while( 1 )
  196.         {
  197.           if( *ponted == NULL ) break;
  198.           k[ k_pos ] = *ponted; k_pos++; ponted++;
  199.         }
  200.         format++;
  201.         break;
  202.       case 'd': k[k_pos]=*format; conv++; sprintf( sp_s, k, va_arg( ap, signed int ) ); go_furthr=0; break;
  203.       case 'i': k[k_pos]=*format; conv++; sprintf( sp_s, k, va_arg( ap, signed int ) ); go_furthr=0; break;
  204.       case 'o': k[k_pos]=*format; conv++; sprintf( sp_s, k, va_arg( ap, unsigned int ) ); go_furthr=0; break;
  205.       case 'u': k[k_pos]=*format; conv++; sprintf( sp_s, k, va_arg( ap, unsigned int ) ); go_furthr=0; break;
  206.       case 'x': k[k_pos]=*format; conv++; sprintf( sp_s, k, va_arg( ap, unsigned int ) ); go_furthr=0; break;
  207.       case 'X': k[k_pos]=*format; conv++; sprintf( sp_s, k, va_arg( ap, unsigned int ) ); go_furthr=0; break;
  208.       case 'f': k[k_pos]=*format; conv++; sprintf( sp_s, k, va_arg( ap, float ) ); go_furthr=0; break;
  209.       case 'e': k[k_pos]=*format; conv++; sprintf( sp_s, k, va_arg( ap, float ) ); go_furthr=0; break;
  210.       case 'g': k[k_pos]=*format; conv++; sprintf( sp_s, k, va_arg( ap, float ) ); go_furthr=0; break;
  211.       case 'E': k[k_pos]=*format; conv++; sprintf( sp_s, k, va_arg( ap, float ) ); go_furthr=0; break;
  212.       case 'G': k[k_pos]=*format; conv++; sprintf( sp_s, k, va_arg( ap, float ) ); go_furthr=0; break;
  213.       case 's': k[k_pos]=*format; conv++; sprintf( sp_s, k, va_arg( ap, char * ) ); go_furthr=0; break;
  214.       case 'c': k[k_pos]=*format; conv++; sprintf( sp_s, k, va_arg( ap, char ) ); go_furthr=0; break;
  215.       case 'n': k[k_pos]=*format; conv++; va_arg( ap, int * ) = (int *)conv; go_furthr=0; break;
  216.       case 'p': k[k_pos]=*format; conv++; sprintf( sp_s, k, va_arg( ap, char * ) ); go_furthr=0; break;
  217. // The 2 above items have not been tested, and may or may not work correctly.
  218.       case NULL: k[0]=NULL; go_furthr=0; break;
  219.       default: k[k_pos] = *format; k_pos++; format++;
  220.       }
  221.       char *g = (char *)sp_s;
  222.       while( 1 ){
  223.     if( *g == NULL ) break;
  224.     *outb = *g;  outb++;  g++;
  225.       }
  226.     } else { *outb = *format; outb++; }
  227.     format++;
  228.   va_end( ap );
  229.   out_codes( outbuf );
  230.   return( conv );
  231. /////////////////////////////////////////////////
  232.      // Macro Serial/Console version of putchar() function.
  233. int putserial( int I ){ s_out( I ); return I; }
  234.      // Macro Serial/Console version of getchar() function.
  235. int getserial( void ){ return( s_in() ); }
  236. int getseriale( void ){ int gtsser=0; gtsser = s_in(); s_out( gtsser );
  237.   return gtsser;
  238.      // Macro Serial/Console version of getch() function.
  239. int getser( void ){ return( s_in() ); }
  240.      // Macro Serial/Console version of getche() function (echo back).
  241. int getsere( void ){ int gtsser=0; gtsser=s_in(); s_out( gtsser );
  242.   return gtsser;
  243.      // Macro Serial/Console version of putch() function.
  244. int putser( int I ){ s_out( I ); return I; }
  245. ///////////////******************////////////////
  246. #if 0
  247. #undef s_out(C)
  248. #undef s_in()           // Undeclaring Low-level output to console
  249. #undef s_ready()
  250. #endif
  251. class TData {
  252.   ENTRY ent, *entp;
  253.   IX_DESC idx, *ixp;
  254.   int handle;
  255.   char fname[80];
  256.   ulong len;
  257.   public:
  258.   ulong high;
  259.   int end;
  260.   int isopen;
  261.   TData( char *FileName, ulong setLen ){
  262.     entp = &ent;
  263.     ixp = &idx;
  264.     strcpy( fname, FileName );
  265.     len = setLen;
  266.   int Open(void);
  267.   void Close(void);
  268.   int Load( ulong num, void *buf );
  269.   int Load( unsigned char *keyword, void *buf );
  270.   int Save( unsigned char *keyword, ulong num, void *buf );
  271.   int Delete( unsigned char *keyword );
  272.   int Change( ulong num, unsigned char *keyword, unsigned char *newkey );
  273.   int Change( ulong num, ulong newnum );
  274.   private:
  275.   ~TData(){ Close(); }
  276. class TData {
  277.   ENTRY ent, *entp;
  278.   IX_DESC idx, *ixp;
  279.   int handle;
  280.   char fname[80];
  281.   ulong len;
  282.   public:
  283.   ulong high;
  284.   int end;
  285.   int isopen;
  286.   TData( char *FileName, ulong setLen ){
  287.     entp = &ent;
  288.     ixp = &idx;
  289.     strcpy( fname, FileName );
  290.     len = setLen;
  291.   int Open(void);
  292.   void Close(void);
  293.   int Load( ulong num, void *buf );
  294.   int Load( unsigned char *keyword, void *buf );
  295.   int Save( unsigned char *keyword, ulong num, void *buf );
  296.   int Delete( unsigned char *keyword );
  297.   int Change( ulong num, unsigned char *keyword, unsigned char *newkey );
  298.   int Change( ulong num, ulong newnum );
  299.   private:
  300.   ~TData(){ Close(); }
  301.   TData( char *FileName, ulong setLen ){
  302.     entp = &ent;
  303.     ixp = &idx;
  304.     strcpy( fname, FileName );
  305.     len = setLen;
  306. void string2date( char *str, struct date *dt )
  307.   char *s = (char *)str, *r = (char *)s;
  308.   r++;
  309.   dt->da_mon = dt->da_day = dt->da_year = 0;
  310.   if( *s == NULL ) return;
  311.   if( *r == '/' || *r == '-' ) dt->da_mon = *s-'0';
  312.   else {
  313.     if( *s == 49 ) dt->da_mon = 10;
  314.     s++; r++; dt->da_mon+=*s-'0';
  315.   s+=2; r+=2;   // xxx21/95
  316.   if( *r == '/' || *r == '-' ) dt->da_day = *s-'0';
  317.   else {
  318.     if( *s >= 48 && *s <= 57 ) dt->da_day = (*s-'0') * 10;
  319.     s++; r++; dt->da_day+=*s-'0';
  320.   s+=2; r+=2;   // xxxxxx95  or xxxxxx1995
  321.   dt->da_year = (*s-'0') * 10;
  322.   s++; r++;
  323.   dt->da_year += (*s-'0');
  324.   if( *r >= 48 && *r <= 57 ){
  325.     s++; r++;
  326.     dt->da_year *= 100;
  327.     dt->da_year += (*s-'0') * 10;
  328.     s++; r++;
  329.     dt->da_year += (*s-'0');
  330.   } else dt->da_year += 1900;
  331. char *format_time( struct time *t, char *s )
  332.   if( t->ti_hour == 0 ) sprintf( s, "12:%02i am", t->ti_min );
  333.   else if( t->ti_hour < 12 ) sprintf( s, "%i:%02i am", t->ti_hour, t->ti_min );
  334.   else if( t->ti_hour == 12 ) sprintf( s, "12:%02i pm", t->ti_min );
  335.   else sprintf( s, "%i:%02i pm", t->ti_hour-12, t->ti_min );
  336.   return (char *)s;
  337. unsigned int twodigit( int n )
  338.   int ii = n;
  339.   if( ii >= 1900 ) ii -= 1900;
  340.   while( ii >= 100 ) ii -= 100;
  341.   return ii;
  342.   getch();
  343.   char *ss;
  344.   strncpy( blockfile, argv[blockfile_arg], 252 );
  345.   ss = strchr( blockfile, '.' );
  346.   if( ss )
  347.     ss++;
  348.     strcpy( ss, "Blk" );
  349.   } else strcat( ss, ".Blk" );
  350. void fileerror( int read )
  351.   if( read )
  352.     printf("\n\nError reading from disk!\n");
  353.   else
  354.     printf("\n\nError writing to disk!\n");
  355.   exit(1);
  356.   _AX = 0x1000;
  357.   asm int 0x15;
  358.   _AX = 0x1680;
  359.   asm int 0x2f;
  360.   return;
  361. long l1, l2, l3;
  362. long *l1pointer = &l1, *l3pointer = &l3;
  363. void dvsleep( int secs )
  364.   _bios_timeofday( _TIME_GETCLOCK, l1pointer );
  365.   l2 = l1; l1 += (18 * secs);
  366.   while( l2 < l1 ){
  367.     dv_pause();
  368.     if( _bios_timeofday( _TIME_GETCLOCK, l3pointer ) )
  369.       l1 = l3 + (18 * secs) - (l2 - (l1 - 18 * secs));
  370.     l2 = l3;
  371. #define OUT_OF_MEMORY -10
  372. #define BAD_CODE_SIZE -20
  373. #define READ_ERROR -1
  374. #define WRITE_ERROR -2
  375. #define OPEN_ERROR -3
  376. #define CREATE_ERROR -4
  377. class Compress {
  378.     short bits;
  379.     FILE *out;
  380.     short get_pixel() = 0;        // Return -1 on finish...
  381.     short compressImage( void );
  382.     void init_table( short );
  383.     void flush( short );
  384.     void write_code( short );
  385. public:
  386.     short failed;
  387.     Compress( FILE *, short /*bits*/ );
  388. #define OUT_OF_MEMORY -10      // Failures returned by private members,
  389. #define BAD_CODE_SIZE -20      // or value of 'failed' when buffer NULL
  390. #define GENERAL_ERROR    -30
  391. #define READ_ERROR         -1
  392. #define WRITE_ERROR     -2
  393. #define OPEN_ERROR         -3
  394. #define CREATE_ERROR     -4
  395. class TSound {
  396. public:
  397. class TSoundDriver {
  398. protected:
  399. public:
  400. typedef struct modemPacket { // Modem packets are always inbound-only...
  401.     uchar InUse;
  402.     uchar data[256];
  403.     modemPacket far *more;
  404. typedef struct netPacket {   // Network packets are inbound & outbound...
  405.     uchar InUse;
  406. // ECBHeader ECB;
  407. // IPXHeader IPX;
  408.     ulong time;
  409.     uchar data[256];
  410.     netPacket far *more;
  411. union TPacket {
  412.     selfPacket  self;
  413.     modemPacket modem;
  414.     netPacket   net;
  415. #ifdef DOS
  416. test DetectSHARE( void )
  417.     _AX = 0x1000;
  418.     _genInt( 0x2F );
  419.     return _AL == 0xFF;
  420. #endif
  421. // ipxnet.c
  422. #include <stdio.h>
  423. #include <stdlib.h>
  424. #include <dos.h>
  425. #include <string.h>
  426. #include <process.h>
  427. #include <values.h>
  428. #include "ipxnet.h"
  429. =============================================================================
  430.                         IPX PACKET DRIVER
  431. =============================================================================
  432. packet_t        packets[NUMPACKETS];
  433. nodeadr_t         nodeadr[MAXNETNODES+1];    // first is local, last is broadcast
  434. nodeadr_t        remoteadr;            // set by each GetPacket
  435. localadr_t        localadr;            // set at startup
  436. int     socketid = 0x869c;        // 0x869c is the official DOOM socket
  437. union   REGS    regs;           // scratch for int86 calls
  438. struct  SREGS   sregs;
  439. unsigned short    enteripx[2];
  440. long               localtime;        // for time stamp in packets
  441. long            remotetime;
  442. //===========================================================================
  443. char *hex = "0123456789abcdef";
  444. void PrintAddress (nodeadr_t *adr, char *str)
  445.     int    i;
  446.     for (i=0 ; i<6 ; i++)
  447.         *str++ = hex[adr->node[i]>>4];
  448.         *str++ = hex[adr->node[i]&15];
  449.     *str = 0;
  450. int OpenSocket(short socketNumber)
  451.     regs.x.bx = 0;
  452.     regs.h.al = 0;                  // longevity
  453.     regs.x.dx = socketNumber;
  454.     int86(0x7A,®s,®s);
  455.     if (regs.h.al)
  456.         Error ("OpenSocket: 0x%x",regs.h.al);
  457.     return regs.x.dx;
  458. void CloseSocket(short socketNumber)
  459.     regs.x.bx = 1;
  460.     regs.x.dx = socketNumber;
  461.     int86(0x7A,®s,®s);
  462. void ListenForPacket(ECB *ecb)
  463.     regs.x.si = FP_OFF(ecb);
  464.     sregs.es = FP_SEG(ecb);
  465.     regs.x.bx = 4;
  466.     int86x (0x7a,®s,®s,&sregs);
  467.     if (regs.h.al)
  468.         Error ("ListenForPacket: 0x%x",regs.h.al);
  469. void GetLocalAddress (void)
  470.     regs.x.si = FP_OFF(&localadr);
  471.     sregs.es = FP_SEG(&localadr);
  472.     regs.x.bx = 9;
  473.     int86x (0x7a,®s,®s,&sregs);
  474.     if (regs.h.al)
  475.         Error ("Get inet addr: 0x%x",regs.h.al);
  476. ====================
  477. = InitNetwork
  478. ====================
  479. void InitNetwork (void)
  480.     int     i,j;
  481. // get IPX function address
  482.     regs.x.ax = 0x7a00;
  483.     int86x (0x2f,®s,®s,&sregs);
  484.     if ( regs.h.al != 0xff)
  485.         Error ("IPX not detected\n");
  486.     enteripx[0] = regs.x.di;
  487.     enteripx[1] = sregs.es;
  488. // allocate a socket for sending and receiving
  489.     i = CheckParm ("-port");
  490.     if (i>0 && i<_argc-1)
  491.         socketid = atoi (_argv[i+1]);
  492.         printf ("Using alternate port %i for network\n",socketid);
  493.     socketid = OpenSocket ( (socketid>>8) + ((socketid&255)<<8) );
  494.     GetLocalAddress ();
  495. // set up several receiving ECBs
  496.     memset (packets,0,NUMPACKETS*sizeof(packet_t));
  497.     for (i=1 ; i<NUMPACKETS ; i++)
  498.         packets[i].ecb.InUseFlag = 0x1d;
  499.         packets[i].ecb.ECBSocket = socketid;
  500.         packets[i].ecb.FragmentCount = 1;
  501.         packets[i].ecb.fAddress[0] = FP_OFF(&packets[i].ipx);
  502.         packets[i].ecb.fAddress[1] = FP_SEG(&packets[i].ipx);
  503.         packets[i].ecb.fSize = sizeof(packet_t)-sizeof(ECB);
  504.         ListenForPacket (&packets[i].ecb);
  505. // set up a sending ECB
  506.     memset (&packets[0],0,sizeof(packets[0]));
  507.     packets[0].ecb.ECBSocket = socketid;
  508.     packets[0].ecb.FragmentCount = 1;
  509.     packets[0].ecb.fAddress[0] = FP_OFF(&packets[0].ipx);
  510.     packets[0].ecb.fAddress[1] = FP_SEG(&packets[0].ipx);
  511.     for (j=0 ; j<4 ; j++)
  512.         packets[0].ipx.dNetwork[j] = localadr.network[j];
  513.     packets[0].ipx.dSocket[0] = socketid&255;
  514.     packets[0].ipx.dSocket[1] = socketid>>8;
  515. // known local node at 0
  516.     for (i=0 ; i<6 ; i++)
  517.         nodeadr[0].node[i] = localadr.node[i];
  518. // broadcast node at MAXNETNODES
  519.     for (j=0 ; j<6 ; j++)
  520.         nodeadr[MAXNETNODES].node[j] = 0xff;
  521. ====================
  522. = ShutdownNetwork
  523. ====================
  524. void ShutdownNetwork (void)
  525.     CloseSocket (socketid);
  526. ==============
  527. = SendPacket
  528. = A destination of MAXNETNODES is a broadcast
  529. ==============
  530. void SendPacket (int destination)
  531.     int             j;
  532. // find a free packet buffer to use
  533.     while (packets[0].ecb.InUseFlag)
  534. // set the time
  535.     packets[0].time = localtime;
  536. // set the address
  537.     for (j=0 ; j<6 ; j++)
  538.         packets[0].ipx.dNode[j] = packets[0].ecb.ImmediateAddress[j] =
  539.         nodeadr[destination].node[j];
  540. // set the length (ipx + time + datalength)
  541.     packets[0].ecb.fSize = sizeof(IPXPacket) + 4 + doomcom.datalength + 4;
  542. // put the data into an ipx packet
  543.     memcpy (&packets[0].data, &doomcom.data, doomcom.datalength);
  544. // send the packet
  545.     regs.x.si = FP_OFF(&packets[0]);
  546.     sregs.es = FP_SEG(&packets[0]);
  547.     regs.x.bx = 3;
  548.     int86x (0x7a, ®s, ®s, &sregs);
  549.     if (regs.h.al)
  550.         Error ("SendPacket: 0x%x",regs.h.al);
  551. unsigned short ShortSwap (unsigned short i)
  552.     return ((i&255)<<8) + ((i>>8)&255);
  553. ==============
  554. = GetPacket
  555. = Returns false if no packet is waiting
  556. ==============
  557. int GetPacket (void)
  558.     int             packetnum;
  559.     int             i, j;
  560.     long            besttic;
  561.     packet_t        *packet;
  562. // if multiple packets are waiting, return them in order by time
  563.     besttic = MAXLONG;
  564.     packetnum = -1;
  565.     doomcom.remotenode = -1;
  566.     for ( i = 1 ; i < NUMPACKETS ; i++)
  567.         if (packets[i].ecb.InUseFlag)
  568.             continue;
  569.         if (packets[i].time < besttic)
  570.             besttic = packets[i].time;
  571.             packetnum = i;
  572.     if (besttic == MAXLONG)
  573.         return 0;                           // no packets
  574.     packet = &packets[packetnum];
  575.     if (besttic == -1 && localtime != -1)
  576.         ListenForPacket (&packet->ecb);
  577.         return 0;                            // setup broadcast from other game
  578.     remotetime = besttic;
  579. // got a good packet
  580.     if (packet->ecb.CompletionCode)
  581.         Error ("GetPacket: ecb.ComletionCode = 0x%x",packet->ecb.CompletionCode);
  582. // set remoteadr to the sender of the packet
  583.     memcpy (&remoteadr, packet->ipx.sNode, sizeof(remoteadr));
  584.     for (i=0 ; i<doomcom.numnodes ; i++)
  585.         if (!memcmp(&remoteadr, &nodeadr[i], sizeof(remoteadr)))
  586.             break;
  587.     if (i < doomcom.numnodes)
  588.         doomcom.remotenode = i;
  589.     else
  590.         if (localtime != -1)
  591.         {    // this really shouldn't happen
  592.             ListenForPacket (&packet->ecb);
  593.             return 0;
  594. // copy out the data
  595.     doomcom.datalength = ShortSwap(packet->ipx.PacketLength) - 38;
  596.     memcpy (&doomcom.data, &packet->data, doomcom.datalength);
  597. // repost the ECB
  598.     ListenForPacket (&packet->ecb);
  599.     return 1;
  600. // ipxnet.h
  601. typedef struct
  602.     char    private[512];
  603. } doomdata_t;
  604. #include "DoomNet.h"
  605. //===========================================================================
  606. #define NUMPACKETS      10            // max outstanding packets before loss
  607. // setupdata_t is used as doomdata_t during setup
  608. typedef struct
  609.     short    gameid;                    // so multiple games can setup at once
  610.     short    drone;
  611.     short    nodesfound;
  612.     short    nodeswanted;
  613. } setupdata_t;
  614. typedef unsigned char BYTE;
  615. typedef unsigned short WORD;
  616. typedef unsigned long LONG;
  617. typedef struct IPXPacketStructure
  618.     WORD    PacketCheckSum;         /* high-low */
  619.     WORD    PacketLength;           /* high-low */
  620.     BYTE    PacketTransportControl;
  621.     BYTE    PacketType;
  622.     BYTE    dNetwork[4];            /* high-low */
  623.     BYTE    dNode[6];               /* high-low */
  624.     BYTE    dSocket[2];             /* high-low */
  625.     BYTE    sNetwork[4];            /* high-low */
  626.     BYTE    sNode[6];               /* high-low */
  627.     BYTE    sSocket[2];             /* high-low */
  628. } IPXPacket;
  629. typedef struct
  630.     BYTE    network[4];             /* high-low */
  631.     BYTE    node[6];                /* high-low */
  632. } localadr_t;
  633. typedef struct
  634.     BYTE    node[6];                /* high-low */
  635. } nodeadr_t;
  636. typedef struct ECBStructure
  637.     WORD    Link[2];                /* offset-segment */
  638.     WORD    ESRAddress[2];          /* offset-segment */
  639.     BYTE    InUseFlag;
  640.     BYTE    CompletionCode;
  641.     WORD    ECBSocket;              /* high-low */
  642.     BYTE    IPXWorkspace[4];        /* N/A */
  643.     BYTE    DriverWorkspace[12];    /* N/A */
  644.     BYTE    ImmediateAddress[6];    /* high-low */
  645.     WORD    FragmentCount;          /* low-high */
  646.     WORD    fAddress[2];            /* offset-segment */
  647.     WORD    fSize;                  /* low-high */
  648. } ECB;
  649. // time is used by the communication driver to sequence packets returned
  650. // to DOOM when more than one is waiting
  651. typedef struct
  652.     ECB             ecb;
  653.     IPXPacket       ipx;
  654.     long            time;
  655.     doomdata_t        data;
  656. } packet_t;
  657. extern    doomcom_t    doomcom;
  658. extern    int            gameid;
  659. extern    nodeadr_t    nodeadr[MAXNETNODES+1];
  660. extern    int            localnodenum;
  661. extern    long           localtime;        // for time stamp in packets
  662. extern    long        remotetime;        // timestamp of last packet gotten
  663. extern    nodeadr_t    remoteadr;
  664. void Error (char *error, ...);
  665. void InitNetwork (void);
  666. void ShutdownNetwork (void);
  667. void SendPacket (int destination);
  668. int GetPacket (void);
  669. int CheckParm (char *check);
  670. void PrintAddress (nodeadr_t *adr, char *str);
  671. int GRAPHIC_oldmode=*(int *)MK_FP(0x40,0x49);
  672. void PageUser( void )
  673.   int best, save_rdcomm = read_commlinks;
  674.   read_commlinks = 0;
  675.   commlink.type = 1;
  676.   commlink.link = 0;
  677.   strcpy( commlink.from, user.handle );
  678.   display(blankline);
  679.   display("\r@CP@cage ] @W");
  680.   sergets( commlink.data, sizeof(commlink.data) );
  681.   while( commlink.data[0] == ' ' ) strdel( commlink.data, 0 );
  682.   if( !strncmpi( commlink.data, "All", 3 ) ){
  683.     if( !user_security() || !security.sysop ){
  684.       read_commlinks = save_rdcomm;
  685.       display("\n@RN@rot allowed...");
  686.       return;
  687.     }
  688.     strdel( commlink.data, 0 ); strdel( commlink.data, 0 );
  689.     strdel( commlink.data, 0 ); strdel( commlink.data, 0 );
  690.     commlink.type = 4;
  691.     int ii=0;
  692.     while( ii<=MaxNodes ){
  693.       if( ii==node.ID.num || !read_nodeid( ii ) || !readid.online ){
  694.     ii++; continue;
  695.       }
  696.       save_commlink( ii++ );
  697.     }
  698.     display("\n@w...@WP@wage sent to all users..." );
  699.     read_commlinks = save_rdcomm;
  700.     return;
  701.   if( (best=FindUserOnline(commlink.data)) == -1 ){
  702.     display("\n@CU@cser not found...");
  703.     read_commlinks = save_rdcomm;
  704.     return;
  705.   save_commlink( best );
  706.   read_commlinks = save_rdcomm;
  707.   display("\n@c...@CP@cage sent..." );
  708. uint best_userserch( uchar *find )
  709.   int jj;
  710.   int amount = 0, best = -1;
  711.   open_user();
  712.   while( next_userserch() )
  713.     if( (jj=matches( find, userserch.handle ) )>=1 )
  714.     {
  715.       if( jj > amount )
  716.       {
  717.     best = userserch.num; amount = jj;
  718.       }
  719.     }
  720.   if( best != -1 ) load_userserch( best );
  721.   close_user();
  722.   return (best!=-1);
  723. #define reset_user()          User.Reset()
  724. #define load_user(N)          User.Load( N, &user )
  725. #define load_userserch(N)     User.Load( N, &userserch )
  726. #define save_user()           User.Save( user.handle, user.num, &user )
  727. #define save_userserch()      User.Save( userserch.handle, userserch.num, &userserch )
  728. #define add_user()            User.Add( user.handle, user.num, &user )
  729. #define add_userserch()       User.Add( userserch.handle, userserch.num, &userserch )
  730. #define delete_user()         User.Delete( user.num, user.handle )
  731. #define delete_userserch()    User.Delete( userserch.num, userserch.handle )
  732. #define open_user()           User.Open()
  733. #define close_user()          User.Close()
  734. #define version_user()        User.CheckVersion()
  735. #define isopen_user()         User.isopen
  736. #define end_user()            User.end
  737. #define high_user()           User.GetHigh()
  738. #define find_user(W)          User.Load( W, &user )
  739. #define find_userserch(W)     User.Load( W, &userserch )
  740. #define next_user()           User.Load( &user )
  741. #define next_userserch()      User.Load( &userserch )
  742. #define key_user()            User.LoadKey()
  743. #define change_user(O,N)      User.Change( user.num, O, N )
  744. #define change_userserch(O,N) User.Change( userserch.num, O, N )
  745. #define number_user(N)        User.Change( user.num, N )
  746. #define number_userserch(N)   User.Change( userserch.num, N )
  747. #define load_master() read_single(WithLSPath("Master.Dat"), &master, sizeof(master), true )
  748. #define save_master() write_single(WithLSPath("Master.Dat"), &master, sizeof(master) )
  749. #define load_master() read_single(WithLSPath("Master.Dat"), &master, sizeof(master), true )
  750. #define save_master() write_single(WithLSPath("Master.Dat"), &master, sizeof(master) )
  751.